options(java.parameters = "-Xmx6G")
library(r5r)
## Loading required namespace: sf
## Loading required namespace: rJava
## Please make sure you have already allocated some memory to Java by running:
## options(java.parameters = '-Xmx2G').
## Currently, Java memory is set to -Xmx6G
library(osmextract)
## Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright.
## Check the package website, https://docs.ropensci.org/osmextract/, for more details.
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.1.4 v dplyr 1.0.7
## v tidyr 1.1.3 v stringr 1.4.0
## v readr 2.0.1 v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(sf)
## Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1
library(ggthemes)
library(ggspatial)
library(tigris)
## To enable
## caching of data, set `options(tigris_use_cache = TRUE)` in your R script or .Rprofile.
library(wesanderson)
library(tidytransit)
library(stars)
## Loading required package: abind
library(magick)
## Linking to ImageMagick 6.9.12.3
## Enabled features: cairo, freetype, fftw, ghostscript, heic, lcms, pango, raw, rsvg, webp
## Disabled features: fontconfig, x11
dir.create("networks")
download.file("https://www.detroitmi.gov/Portals/0/docs/deptoftransportation/pdfs/ddot_gtfs.zip", file.path("networks","ddot_gtfs.zip"), mode = "wb", quiet=TRUE)
Detroit_file <- oe_match("Detroit")
Detroit_streets <- oe_read("networks/bbbike_detroit.pbf",
download_directory = "networks",
layer = "lines",
quiet = TRUE) %>%
filter(!is.na(highway))
michigan_state_plane <- "+proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs"
Detroit_city_limits <- places("Michigan") %>%
filter(NAME == "Detroit") %>%
st_transform(crs = st_crs(Detroit_streets))
Detroit_streets <- Detroit_streets[Detroit_city_limits,]
ggplot() +
geom_sf(data = Detroit_streets, alpha = 0.1) +
coord_sf(crs = michigan_state_plane)
rJava::.jgc(R.gc = TRUE)
grid <- st_sf(st_make_grid(Detroit_city_limits,
square = FALSE,
n = c(100,100),
what = "polygons"))%>%
st_filter(Detroit_city_limits)
colnames(grid) <- "geometry"
st_geometry(grid) <- "geometry"
grid <- grid %>%
mutate(id = seq(1, length(grid$geometry), by=1))
# ggplot() +
# geom_sf(data = grid) +
# theme_map()
#Detroit School Work
Detroit_school <- oe_read("networks/bbbike_detroit.pbf",
provider = "openstreetmap_fr",
download_directory = "networks",
layer = "points",
quiet = TRUE) %>%
filter(str_detect(other_tags,'"amenity"=>"school"')) %>%
st_filter(Detroit_city_limits) %>%
rename(id = osm_id)
#Aeshna’s Schools Map, 0A
# ggplot(Detroit_streets) +
# geom_sf(color = 'azure2', alpha = 0.2) +
# geom_sf(data = Detroit_school, color = "pink4") +
# coord_sf(crs = michigan_state_plane) +
# theme_void()
plot(image_read("images/Aeshna_0A.png"))
grid_points <- st_centroid(grid)
ggplot() +
geom_sf(data = grid_points, size = 0.75) +
geom_sf(data = Detroit_school, color = "pink4") +
theme_map()
r5r_core <- setup_r5("networks", verbose = FALSE)
ttm_school <- travel_time_matrix(r5r_core = r5r_core,
origins = st_transform(x = Detroit_school, crs = "WGS84"),
destinations = st_transform(x = grid_points, crs = "WGS84"),
mode = "BICYCLE",
departure_datetime = as.POSIXct("15-11-2021 14:00:00",
format = "%d-%m-%Y %H:%M:%S"),
max_walk_dist = 1000,
max_trip_duration = 480,
verbose = FALSE)
tt_wide_school <- ttm_school %>%
pivot_wider(names_from = fromId,
names_prefix = "from", values_from = travel_time) %>%
rename(id = toId) %>%
merge(grid) %>%
replace(is.na(.), 999) %>%
rowwise() %>%
mutate(from_any = min(c_across(starts_with("from")), na.rm = TRUE))
st_geometry(tt_wide_school) <- "geometry"
#Aeshna’s Cycling to School Map, 2A
# ggplot() +
# geom_sf(data = tt_wide_school,
# aes(fill = from_any),
# color = NA) +
# geom_sf(data = Detroit_school, color = 'ivory3') +
# geom_sf(data = Detroit_streets , alpha = 0.05)+
# scale_fill_gradientn(colors = wes_palette(name = "Chevalier1", n= 3, type = "continuous"),
# name = "Cycling time to\nthe nearest school\n(minutes)",
# position = "right") +
# coord_sf(crs = michigan_state_plane) +
# theme_map()+
# theme(legend.position = "right")
plot(image_read("images/Aeshna_2A.png"))
#Aeshna’s School Isochrone Map, 1A
# iso_pallete <- wes_palette("Royal2", n = 5)
#
# iso5min_school <- tt_wide_school[tt_wide_school$from_any < 6,] %>%
# st_union()
#
# iso10min_school <- tt_wide_school[tt_wide_school$from_any < 11,] %>%
# st_union()
#
# iso15min_school <- tt_wide_school[tt_wide_school$from_any < 16,] %>%
# st_union()
#
# ggplot(Detroit_streets) +
# geom_sf(data = iso15min_school,
# aes(fill = "Area within 15 minutes"),
# color = NA) +
# geom_sf(data = iso10min_school,
# aes(fill = "Area within 10 minutes"),
# color = NA) +
# geom_sf(data = iso5min_school,
# aes(fill = "Area within 5 minutes"),
# color = NA) +
# geom_sf(alpha = 0.1) +
# scale_fill_manual(values = c(iso_pallete[1],
# iso_pallete[3],
# iso_pallete[5]),
# name = "Cycling \ntime to the\nnearest school\n(minutes)") +
# coord_sf(crs = michigan_state_plane) +
# theme_map()
plot(image_read("images/Aeshna_1A.png"))
school_grid <- grid %>%
mutate(num_school = lengths(st_covers(grid, Detroit_school)))
school_points <- st_centroid(school_grid)
ggplot(school_points) +
geom_sf(aes(color = as.character(num_school))) +
scale_color_manual(values = c("lightgray", "skyblue", "deepskyblue4", "blue4", "black"),
name = "Number of\nschools") +
theme_void()
Detroit_access_school <- accessibility(r5r_core,
origins = school_points,
destinations = school_points,
mode = "BICYCLE",
opportunities_colname = "num_school",
decay_function = "step",
cutoffs = 11,
max_walk_dist = 5000,
time_window = 120,
percentile = 50,
verbose = FALSE) %>%
mutate(id = as.numeric(from_id)) %>%
merge(grid)
#Aeshna’s Schools Reachable by Cycling Map, 3A
# st_geometry(Detroit_access_school) <- "geometry"
#
# ggplot(Detroit_access_school) +
# geom_sf(aes(fill = accessibility), color = NA) +
# scale_fill_viridis_c(name = "Schools within \n a 20-minute \nbicycle ride") +
# coord_sf(crs = michigan_state_plane) +
# theme_void()
plot(image_read("images/Aeshna_3A.png"))
Detroit_school_access2 <- accessibility(r5r_core,
origins = school_points,
destinations = school_points,
mode = "BICYCLE",
opportunities_colname = "num_school",
decay_function = "exponential",
cutoffs = 11,
departure_datetime = as.POSIXct("15-11-2021 14:00:00",
format = "%d-%m-%Y %H:%M:%S"),
max_walk_dist = 5000,
time_window = 120,
percentiles = 50,
verbose = FALSE) %>%
mutate(id = as.numeric(from_id)) %>%
merge(grid)
st_geometry(Detroit_school_access2) <- "geometry"
ggplot(Detroit_school_access2) +
geom_sf(aes(fill = accessibility), color = NA) +
scale_fill_viridis_c(name = "Accessiblity score") +
coord_sf(crs = michigan_state_plane) +
theme_void()
rJava::.jgc(R.gc = TRUE)
st_write(Detroit_school_access2, 'Detroit_school_access.geojson', append=FALSE, quiet=TRUE )
access_poly_school <- st_read("Detroit_school_access.geojson", quiet=TRUE)
access_raster_school <- st_rasterize(access_poly_school["accessibility"],
nx = 1000, ny = 1000)
plot(access_raster_school)
#Aeshna’s Cycling to School Accessibility Score Map, 4A
# ggplot(Detroit_streets) +
# geom_stars(data = access_raster_school) +
# geom_sf(color = "white", alpha = 0.05) +
# scale_fill_viridis_c(na.value = NA,
# option="A",
# name = "Accessibility score \nof bicycle access to\nschools") +
# theme_void()
plot(image_read("images/Aeshna_4A.png"))
access_points_school <- st_as_sf(access_raster_school, as_points = TRUE)
ggplot(Detroit_streets) +
geom_sf(data = access_points_school, aes(color = accessibility), size = 0.1) +
scale_color_viridis_c(na.value = NA,
option="A",
name = "Bicycle access to\nschools") +
theme_void()
access_poly_school2 <- st_as_sf(access_raster_school, as_points = FALSE, merge = TRUE)
ggplot(Detroit_streets) +
geom_sf(data = access_poly_school2, aes(fill = accessibility), color = 'gray') +
scale_fill_viridis_c(na.value = NA,
option="A",
name = "Bicycle access to\nschools") +
theme_void()
access_contours_school <- st_contour(access_raster_school, contour_lines = TRUE,
breaks = c(0,1,2,3,4,5,6,7,8))
ggplot(Detroit_streets) +
geom_sf(color = "gray", alpha = 0.2) +
geom_sf(data = access_contours_school, aes(color = accessibility), fill = NA) +
scale_color_viridis_c(na.value = NA,
option="A",
breaks = c(0,1,2,3,4,5,6,7,8),
name = "Bicycle access to\nschools") +
theme_void()
#Detroit Libraries
#Keana’s Libraries Map 0B
# Detroit_library <- oe_read("networks/bbbike_detroit.pbf",
# provider = "openstreetmap_fr",
# download_directory = "networks",
# layer = "points",
# quiet = TRUE) %>%
# filter(str_detect(other_tags, '"amenity"=>"library')) %>%
# st_filter(Detroit_city_limits) %>%
# rename(id = osm_id)
#
# ggplot(Detroit_streets) +
# geom_sf(color = 'azure2', alpha = 0.2) +
# geom_sf(data = Detroit_library, color = "darkorchid1") +
# coord_sf(crs = michigan_state_plane) +
# theme_void()
plot(image_read("images/Keana_0B.png"))
grid <- st_sf(st_make_grid(Detroit_city_limits,
square = FALSE,
n = c(100,100),
what = "polygons")) %>%
st_filter(Detroit_city_limits)
colnames(grid) <- "geometry"
st_geometry(grid) <- "geometry"
grid <- grid %>%
mutate(id = seq(1, length(grid$geometry), by=1))
grid_points <- st_centroid(grid)
ggplot(grid) +
geom_sf() +
geom_sf(data = Detroit_library, color = "chartreuse") +
geom_sf(data = Detroit_streets, alpha = 0.2) +
coord_sf(crs = michigan_state_plane) +
theme_map()
ttm <- travel_time_matrix(r5r_core = r5r_core,
origins = Detroit_library,
destinations = grid_points,
mode = c("WALK"),
departure_datetime = as.POSIXct("15-11-2021 14:00:00",
format = "%d-%m-%Y %H:%M:%S"),
max_walk_dist = 1609.34,
max_trip_duration = 480,
verbose = FALSE)
ttm_library <- travel_time_matrix(r5r_core = r5r_core,
origins = st_transform(x = Detroit_library, crs = "WGS84"),
destinations = st_transform(x = grid_points, crs = "WGS84"),
mode = "BICYCLE",
departure_datetime = as.POSIXct("15-11-2021 14:00:00",
format = "%d-%m-%Y %H:%M:%S"),
max_walk_dist = 1000,
max_trip_duration = 480,
verbose = FALSE)
tt_wide_library <- ttm_library %>%
pivot_wider(names_from = fromId,
names_prefix = "from", values_from = travel_time) %>%
rename(id = toId) %>%
merge(grid) %>%
replace(is.na(.), 999) %>%
rowwise() %>%
mutate(from_any = min(c_across(starts_with("from")), na.rm = TRUE))
st_geometry(tt_wide_library) <- "geometry"
tt_wide <- ttm %>%
pivot_wider(names_from = fromId,
names_prefix = "from", values_from = travel_time) %>%
rename(id = toId) %>%
merge(grid) %>%
replace(is.na(.), 999) %>%
rowwise() %>%
mutate(from_any = min(c_across(starts_with("from")), na.rm = TRUE))
st_geometry(tt_wide) <- "geometry"
#Keana’s Cycling to Library Map, 2B
# ggplot(Detroit_streets) +
# geom_sf(data = tt_wide_library,
# aes(fill = from_any),
# color = NA) +
# geom_sf(alpha = 0.1) +
# scale_fill_gradient2(low = "green", mid = "yellow", high = "red",
# midpoint = 30,
# name = "bike\ntime to the\nnearest library\n(minutes)") +
# coord_sf(crs = michigan_state_plane) +
# theme_map()
plot(image_read("images/Keana_2B.png"))
#Keana’s Library Isochrone, 1B
# iso_pallete <- wes_palette("Darjeeling1", n = 5)
#
# iso10min <- tt_wide_library[tt_wide_library$from_any < 11,] %>%
# st_union()
#
# iso20min <- tt_wide_library[tt_wide_library$from_any < 21,] %>%
# st_union()
#
# iso30min <- tt_wide_library[tt_wide_library$from_any < 31,] %>%
# st_union()
#
# ggplot(Detroit_streets) +
# geom_sf(data = iso30min,
# aes(fill = "Area within 30 minutes"),
# color = NA) +
# geom_sf(data = iso20min,
# aes(fill = "Area within 20 minutes"),
# color = NA) +
# geom_sf(data = iso10min,
# aes(fill = "Area within 10 minutes"),
# color = NA) +
# geom_sf(alpha = 0.1) +
# scale_fill_manual(values = c(iso_pallete[1],
# iso_pallete[3],
# iso_pallete[5]),
# name = "bike\ntime to the\nnearest library\n(minutes)") +
# coord_sf(crs = michigan_state_plane) +
# theme_map()
plot(image_read("images/Keana_1B.png"))
library_grid <- grid %>%
mutate(num_library = lengths(st_covers(grid, Detroit_library)))
library_points <- st_centroid(library_grid)
#Alex’s Libraries Reachable by Cycling Map, 3B
# Detroit_library_access <- accessibility(r5r_core,
# origins = library_points,
# destinations = library_points,
# mode = "BICYCLE",
# opportunities_colname = "num_library",
# decay_function = "step",
# cutoffs = 11,
# departure_datetime = as.POSIXct("15-11-2021 14:00:00",
# format = "%d-%m-%Y %H:%M:%S"),
# max_walk_dist = 5000,
# time_window = 120,
# percentiles = 50,
# verbose = FALSE) %>%
# mutate(id = as.numeric(from_id)) %>%
# merge(grid)
#
# st_geometry(Detroit_library_access) <- "geometry"
#
# ggplot(Detroit_library_access) +
# geom_sf(aes(fill = accessibility), color = NA) +
# scale_fill_viridis_c(name = "Libraries\nwithin a 20-minute\nbicycle ride") +
# coord_sf(crs = michigan_state_plane) +
# theme_void()
plot(image_read("images/Alex_3B.png"))
Detroit_library_access <- accessibility(r5r_core,
origins = library_points,
destinations = library_points,
mode = "BICYCLE",
opportunities_colname = "num_library",
decay_function = "exponential",
cutoffs = 11,
departure_datetime = as.POSIXct("15-11-2021 14:00:00",
format = "%d-%m-%Y %H:%M:%S"),
max_walk_dist = 5000,
time_window = 120,
percentiles = 50,
verbose = FALSE) %>%
mutate(id = as.numeric(from_id)) %>%
merge(grid)
st_geometry(Detroit_library_access) <- "geometry"
ggplot(Detroit_library_access) +
geom_sf(aes(fill = accessibility), color = NA) +
scale_fill_viridis_c(name = "Accessiblity score") +
coord_sf(crs = michigan_state_plane) +
theme_void()
st_write(Detroit_library_access, 'Detroit_library_access.geojson', append=FALSE, quiet=TRUE )
access_poly_library <- st_read("Detroit_library_access.geojson", quiet=TRUE)
access_raster_library <- st_rasterize(access_poly_library["accessibility"],
nx = 1000, ny = 1000)
# ggplot(Detroit_streets) +
# geom_stars(data = access_raster_library) +
# geom_sf(color = "white", alpha = 0.05) +
# scale_fill_viridis_c(na.value = NA,
# option="A",
# name = "Accessibility score \nof bicycle access to\nlibraries") +
# theme_void()
plot(image_read("images/Alex_4B.png"))
stop_r5(r5r_core)